ホームに戻る
出典 :
関連 :
目次 :
INotifyPropertyChanged とは
自身のプロパティが変更されたことをクラス外に通知するためのインタフェース。
実装することで、プロパティが変更された際にイベントを発行することができる。
データバインディングとの関係
INotifyPropertyChanged
は主に
データバインディングの手段として用いられる。
即ち、( MVVM における ViewModel の)プロパティの変更をUI( MVVM の View )コントロールに通知する(もしくは逆)ために用いる。
実装例
以下、C#7における実装例を示す。
通知する側
// プロパティが変更された際に通知を行う Sample クラス
public class Sample : INotifyPropertyChanged;
{
// プロパティが変更された際に実行するイベントフック
public event PropertyChangedEventHandler EventHook;
// PropertyChanged (プロパティ変更)イベント発行
private void RaiseEvent( [CallerMemberName]string propertyName = null )
{
// EventHook が null でなければ実行
// 第1引数 : オブジェクト(イベントセンダ)
// 第2引数 : PropertyChanged イベント引数
EventHook?.Invoke( this, new PropertyChangedEventArgs(propertyName) );
}
// プロパティの実体となるフィールド
private string _Name = "Hejlsberg";
// プロパティ
public string Name
{
// get アクセサ
get => _Name;
// set アクセサ
set
{
// 値が異なる(更新される)場合
if (value != _Name)
{
// 値を更新
_Name = value;
// イベント発行
RaiseEvent( nameof(Name) );
}
}
}
}
通知を受ける側
:
Sample sample = new Sample();
// イベントハンドラを登録
sample.EventHook += (s, e) => { Console.WriteLine($"{e.PropertyName} が変更されました。"); }
:
上記は Sample クラスの Name プロパティが変更された際に通知を行う場合のコードである。
通知を受ける側は Sample の EventHook に、実行させたいイベントハンドラ(コールバック)を登録する。
通知する側( Sample )は Name プロパティが変更された際にPropertyChanged
イベントを発行する(フックに登録されたコールバックを実行する)。
その際に変更されたプロパティ名を( nameof() で取得して)渡すため、受け側ではどのプロパティが変更されたのかをイベント引数から取得することができる。
WPFにおける INotifyPropertyChanged 実装の支援
上述のように、
INotifyPropertyChanged
の実装は煩雑であるが、
ReactivePropertyを用いることで比較的簡単に実装を行うことができる。
詳細は各リンク先を参照。